home *** CD-ROM | disk | FTP | other *** search
/ Mac Magazin/MacEasy 79 / maccd 79.iso / multimedial / GL Tron / Source / gltron / trails_buffered.c < prev   
Encoding:
C/C++ Source or Header  |  2001-07-10  |  6.0 KB  |  255 lines  |  [TEXT/CWIE]

  1. #include "gltron.h"
  2.  
  3. int getTrailCount() {
  4.   int i;
  5.   int c = 0;
  6.   line *l;
  7.   for(i = 0; i < game->players; i++) {
  8.     l = game->player[i].data->trails;
  9.     while(l != game->player[i].data->trail) {
  10.       l++;
  11.       c++;
  12.     }
  13.   }
  14.   /* fprintf(stderr, "trails: %d\n", c); */
  15.   return c;
  16. }
  17. void bufferPlayerBow(Player *p, QuadBuffer *qb) {
  18.   Data *data;
  19.   Quad *q;
  20.   float height;
  21.   float ex, ey, sx, sy;
  22.   int bdist;
  23.   float white[] = { 1.0, 1.0, 1.0, 1.0 };
  24.  
  25.   data = p->data;
  26.   height = data->trail_height;
  27.   if(height < 0) return;
  28.  
  29.   q = getNextQuad(qb);
  30.   q->type = QUAD_COLOR;
  31.   glShadeModel(GL_SMOOTH);
  32.  
  33.   if(data->speed > 0 && game->settings->show_model == 1) {
  34.     q->type |= QUAD_TEXTURE | QUAD_TEX_MODULATE;
  35.     q->texture_id = game->screen->textures[TEX_TRAIL];
  36.   }
  37.  
  38.   bdist = (game->settings->show_model &&
  39.        data->speed > 0) ? 2 : 3;
  40.  
  41.   sx = getSegmentEndX(data->trail, data, 0);
  42.   sy = getSegmentEndY(data->trail, data, 0);
  43.  
  44.   ex = getSegmentEndX(data->trail, data, bdist);
  45.   ey = getSegmentEndY(data->trail, data, bdist);
  46.  
  47.   q_setColor4fv(q, 0, white);
  48.   q_setTexCoord2f(q, 0, 0.0, 0.0);
  49.   q_setVertex3f(q, 0, sx, sy, 0.0);
  50.  
  51.   q_setColor4fv(q, 1, p->model->color_model);
  52.   q_setTexCoord2f(q, 1, 1.0, 0.0);
  53.   q_setVertex3f(q, 1, ex, ey, 0.0);
  54.  
  55.   q_setColor4fv(q, 2, p->model->color_model);
  56.   q_setTexCoord2f(q, 2, 1.0, 1.0);
  57.   q_setVertex3f(q, 2, ex, ey, height);
  58.  
  59.   q_setColor4fv(q, 3, white);
  60.   q_setTexCoord2f(q, 3, 0.0, 1.0);
  61.   q_setVertex3f(q, 3, sx, sy, height);
  62. }
  63.  
  64. void bufferPlayerTrail(Player *p, QuadBuffer *qb) {
  65.   line *line;
  66.   float height;
  67.   float uv, ex, ey;
  68.   float normal1[] = { 1.0, 0.0, 0.0 };
  69.   float normal2[] = { 0.0, 1.0, 0.0 };
  70.   float *normal;
  71.   float color[4];
  72.   float white[] = { 1.0, 1.0, 1.0, 1.0 };
  73.   Data *data;
  74.   Quad *q;
  75.   int tex;
  76.  
  77.   tex = game->screen->textures[TEX_DECAL];
  78.  
  79.   data = p->data;
  80.   height = data->trail_height;
  81.  
  82.   if(height < 0) return;
  83.  
  84.   /* calculate trail color and set blending modes */
  85.   if(game->settings->alpha_trails) {
  86.     setColor4fv(p->model->color_alpha);
  87.   } else {
  88.     setColor3fv(p->model->color_alpha);
  89.   }
  90.  
  91.   /* start drawing */
  92.   line = &(data->trails[0]);
  93.   while(line != data->trail) { /* the last segment is special cased */
  94.     q = getNextQuad(qb);
  95.     if(game->settings->softwareRendering == 0) 
  96.       q->type = QUAD_COLOR | QUAD_TEXTURE | QUAD_TEX_DECAL;
  97.     else q->type = QUAD_COLOR;
  98.     q->texture_id = tex;
  99.     if(line->sy == line->ey) normal = normal1;
  100.     else normal = normal2;
  101.  
  102.     /* glNormal3fv(normal); */
  103.     setNormal3fv(normal);
  104.     setVertex3f((line->sx + line->ex) / 2, (line->sy + line->ey) / 2, 0);
  105.     light4fv(color);
  106.     
  107.     q_setColor4fv(q, 0, color);
  108.     q_setTexCoord2f(q, 0, 0.0, 0.0);
  109.     q_setVertex3f(q, 0, line->sx, line->sy, 0.0);
  110.  
  111.     uv = getSegmentUV(line);
  112.  
  113.     q_setColor4fv(q, 1, color);
  114.     q_setTexCoord2f(q, 1, uv, 0.0);
  115.     q_setVertex3f(q, 1, line->ex, line->ey, 0.0);
  116.  
  117.     q_setColor4fv(q, 2, color);
  118.     q_setTexCoord2f(q, 2, uv, 1.0);
  119.     q_setVertex3f(q, 2, line->ex, line->ey, height);
  120.  
  121.     q_setColor4fv(q, 3, color);
  122.     q_setTexCoord2f(q, 3, 0.0, 1.0);
  123.     q_setVertex3f(q, 3, line->sx, line->sy, height);
  124.  
  125.  
  126.     line++;
  127.   }
  128.  
  129.   if(line->sy == data->posy) normal = normal1;
  130.   else normal = normal2;
  131.   /* glNormal3fv(normal); */
  132.  
  133.   /* calculate segment color */
  134.   setNormal3fv(normal);
  135.   setVertex3f(line->sx, line->sy, 0);
  136.   light4fv(color);
  137.  
  138.   q = getNextQuad(qb);
  139.   if(game->settings->softwareRendering == 0) 
  140.     q->type = QUAD_COLOR | QUAD_TEXTURE | QUAD_TEX_DECAL;
  141.   else q->type = QUAD_COLOR;
  142.  
  143.   q->texture_id = tex;
  144.  
  145.   q_setColor4fv(q, 0, color);
  146.   q_setTexCoord2f(q, 0, 0.0, 0.0);
  147.   q_setVertex3f(q, 0, line->sx, line->sy, 0.0);
  148.  
  149.   uv = getSegmentEndUV(line, data);
  150.   ex = getSegmentEndX(line, data, 1);
  151.   ey = getSegmentEndY(line, data, 1);
  152.  
  153.   q_setColor4fv(q, 1, color);
  154.   q_setTexCoord2f(q, 1, uv, 0.0);
  155.   q_setVertex3f(q, 1, ex, ey, 0.0);
  156.  
  157.   /* uv = getSegmentUV(line); // wrong! */
  158.   q_setColor4fv(q, 2, color);
  159.   q_setTexCoord2f(q, 2, uv, 1.0);
  160.   q_setVertex3f(q, 2, ex, ey, height);
  161.  
  162.  
  163.   q_setColor4fv(q, 3, color);
  164.   q_setTexCoord2f(q, 3, 0.0, 1.0);
  165.   q_setVertex3f(q, 3, line->sx, line->sy, height);
  166.  
  167.   /* 
  168.   printf("uv for last segment: %.3f\n");
  169.   printf("segment lenght: %.2f\n", (ex - line->sx) + (ey - line->sy));
  170.   */
  171.  
  172.   /* experimental trail effect */
  173.   checkGLError("before trail");
  174.  
  175.   q = getNextQuad(qb);
  176.   q->type = QUAD_COLOR;
  177.     
  178.   q_setColor4fv(q, 0, color);
  179.   q_setVertex3f(q, 0, ex, ey, 0.0);
  180.  
  181.   q_setColor4fv(q, 3, color);
  182.   q_setVertex3f(q, 3, ex, ey, height);
  183.  
  184.   uv = getSegmentUV(line);
  185.   ex = getSegmentEndX(line, data, 0);
  186.   ey = getSegmentEndY(line, data, 0);
  187.  
  188.   memcpy(color, white, sizeof(color));
  189.  
  190.   q_setColor4fv(q, 2, color);
  191.   q_setVertex3f(q, 2, ex, ey, height);
  192.  
  193.   q_setColor4fv(q, 1, color);
  194.   q_setVertex3f(q, 1, ex, ey, 0.0);
  195.  
  196. }
  197.  
  198. void bufferTrails(QuadBuffer *q) {
  199.   int i;
  200.   for(i = 0; i < game->players; i++) {
  201.     bufferPlayerTrail(game->player + i, q);
  202.     bufferPlayerBow(game->player + i, q);
  203.   }
  204. }
  205.  
  206. void drawTrails(QuadBuffer *q, int *index) {
  207.   int i;
  208.  
  209.   if(index == NULL) {
  210.     for(i = 0; i < q->current; i++)
  211.       renderQuad(q->quads + i);
  212.   } else {
  213.     for(i = 0; i < q->current; i++) {
  214.       /* printf("drawing quad %d\n", index[i]); */
  215.       renderQuad(q->quads + index[i] );
  216.     }
  217.   }
  218.   glDisable(GL_TEXTURE_2D);
  219. }
  220.  
  221. void doTrails(Player *p) {
  222.   static QuadBuffer *q = NULL;
  223.   int size;
  224.   int *index;
  225.   if(q == NULL) {
  226.     size = getTrailCount() + 12;
  227.     printf("allocating QuadBuffer, size %d\n", size);
  228.     q = createQuadBuffer(size);
  229.   } else {
  230.     size = getTrailCount() + 12;
  231.     if(size > q->size) { 
  232.       printf("reallocating QuadBuffer, size %d\n", size);
  233.       freeQuadBuffer(q);
  234.       /* we don't want to reallocate immediately, no make it a bit larger */
  235.       q = createQuadBuffer(size + 36); 
  236.     }
  237.   }
  238.   q->current = 0;
  239.   bufferTrails(q);
  240.   index = getSortedQuads(q, p->camera->cam);
  241.  
  242.   clearState();
  243.   drawTrails(q, index);
  244.   // drawTrails(q, NULL);
  245.   if(index != NULL) free(index);
  246.   
  247.  
  248.   /* 
  249.      printf("%d texture bounds\n", state->binds);
  250.      printf("%d texture mod changes\n", state->mod_changes);
  251.   */
  252. }
  253.  
  254.  
  255.